Data Overview
data <- read_csv(here::here("data/jackson.csv"),
col_types = cols(
.default = col_double(),
album_uri = col_character(),
album_name = col_character(),
album_img = col_character(),
album_release_date = col_character(),
album_release_year = col_date(format = ""),
album_popularity = col_integer(),
track_name = col_character(),
track_uri = col_character(),
key = col_character(),
mode = col_character(),
time_signature = col_integer(),
key_mode = col_character(),
track_popularity = col_integer()
)) %>%
mutate(album_name = gsub(".*(1954).*",
"The Music of Brazil/Jackson do Pandeiro",
album_name));
data %>%
glimpse()
Observations: 500
Variables: 23
$ album_uri <chr> "5T9tTjPIfjbUJGRJdYOOLl", "5T9tTjPIfjbUJGRJdYOOLl", "5T9tTjPI...
$ album_name <chr> "Jackson Do Pandeiro Volume 1: Tum, Tum, Tum!", "Jackson Do P...
$ album_img <chr> "https://i.scdn.co/image/5dcc4a0cad740f1ee0774196d0a14f3693ef...
$ album_release_date <chr> "1958-11-11", "1958-11-11", "1958-11-11", "1958-11-11", "1958...
$ album_release_year <date> 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, ...
$ album_popularity <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ track_name <chr> "Tum, Tum, Tum", "Pacífico Pacato", "Nortista Quatrocentão", ...
$ track_uri <chr> "6cCYhV6fU68uzbjWPG9V7x", "6Gu7y9SgtVTGh8YGhDPtCe", "1hq7M7cJ...
$ danceability <dbl> 0.501, 0.663, 0.550, 0.447, 0.544, 0.571, 0.495, 0.572, 0.500...
$ energy <dbl> 0.987, 0.962, 0.947, 0.969, 0.972, 0.926, 0.967, 0.986, 0.947...
$ key <chr> "A", "F", "D", "G", "E", "F", "E", "C", "F", "A#", "E", "F", ...
$ loudness <dbl> 2.561, 1.137, 1.621, 2.743, 2.513, 2.414, 2.375, 2.597, 3.078...
$ mode <chr> "major", "major", "major", "major", "minor", "major", "minor"...
$ speechiness <dbl> 0.0429, 0.1810, 0.0469, 0.0549, 0.0502, 0.0344, 0.0576, 0.036...
$ acousticness <dbl> 0.718, 0.738, 0.666, 0.759, 0.787, 0.651, 0.712, 0.194, 0.286...
$ instrumentalness <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ liveness <dbl> 0.282, 0.200, 0.251, 0.333, 0.176, 0.342, 0.321, 0.301, 0.323...
$ valence <dbl> 0.963, 0.961, 0.923, 0.899, 0.783, 0.961, 0.755, 0.989, 0.957...
$ tempo <dbl> 101.676, 113.562, 116.125, 116.023, 112.863, 133.065, 117.822...
$ duration_ms <dbl> 158133, 139773, 163173, 143733, 151653, 157480, 158133, 15468...
$ time_signature <int> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4...
$ key_mode <chr> "A major", "F major", "D major", "G major", "E minor", "F maj...
$ track_popularity <int> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0...
Dançabilidade (danceability)
data %>%
ggplot(aes(sample=danceability)) +
stat_qq()

hchart (data$danceability,
color = "#B71C1C",
name = "Dançabilidade")
- Nenhum valor fora do domínio dos valores, a dançabilidade parece girar em torno de 0.6 e 0.7.
Verbosidade (speechines)
data %>%
ggplot(aes(sample=speechiness)) +
stat_qq()

hchart (data$speechiness,
color = "#B71C1C",
name = "Verbosidade")
- Nenhum valor fora do domínio dos valores. A verbosidade é em geral baixa, observando a música de Jackson o ritmo parece ser a questão principal, com letras curtas e quase repetitivas.
Duração (duration)
data <- data %>%
mutate(duration_s = duration_ms/1000)
data %>%
select(duration_s) %>%
glimpse()
Observations: 500
Variables: 1
$ duration_s <dbl> 158.133, 139.773, 163.173, 143.733, 151.653, 157.480, 158.133, 154.68...
data %>%
ggplot(aes(sample=duration_s)) +
stat_qq()

hchart (data$duration_s,
color = "#B71C1C",
name = "Duração (s)")
- Nenhum valor fora do domínio dos valores. As músicas giram em torno de 160 segundos (2 minutos e 40 segundos), as músicas de Jackson são em geral curtas.
Remasterização (remaster)
data <- data %>%
mutate(remaster = album_release_date > "1981-30-12")
data %>%
select(album_name, album_release_year, remaster) %>%
sample_n(10)
temp <- data %>%
distinct(album_name,
.keep_all = TRUE) %>%
mutate(remaster = ifelse(remaster == TRUE,"remasterizado","original"))
hchart(temp$remaster,
colorByPoint = TRUE,
name="Álbum")
- Álbuns remasterizados/relançados são muito mais frequentes.
temp <-
data %>%
distinct(album_name, .keep_all = TRUE) %>%
group_by(album_release_year) %>%
summarise(original_n = sum(!remaster),
remaster_n = sum(remaster))
highchart() %>%
hc_xAxis(categories = temp$album_release_year) %>%
hc_add_series(temp$original_n,
type = "column",
color = "#B71C1C",
name = "Não remasterizado") %>%
hc_add_series(temp$remaster_n,
type = "column",
name = "Remasterizado") %>%
hc_title(text = "Número de álbuns por ano")
- O ano de 2016 representa um aumento altíssimo na disponibilização de álbuns de Jackson no Spotify.
LS0tCnRpdGxlOiAiSmFja3NvbiBkbyBQYW5kZWlybyAtIFRoZSBraW5nIG9mIHJpdGhtIgpzdWJ0aXRsZTogJ0FuYWx5c2lzIHdpdGggaW50ZXJhY3RpdmUgdmlzdWFsaXphdGlvbnMgYWJvdXQgSmFja3NvbiBkbyBQYW5kZWlybyBvbiBkYXRhIGZyb20gU3BvdGlmeScKYXV0aG9yOiAiSm9zw6kgQmVuYXJkaSBkZSBTb3V6YSBOdW5lcyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgo8YnI+CgoqKioKCjxicj4KCiMjIEVtcGxveWVkIGRhdGFzZXQKCkV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgb24gZGF0YSBmcm9tIFtTcG90aWZ5XShodHRwczovL3d3dy5zcG90aWZ5LmNvbS9ici8pIGFib3V0IHRoZSBhbGJ1bXMgYW5kIG11c2ljcyBvZiBKYWNrc29uIGRvIFBhbmRlaXJvLiBUaGUgb3JpZ2luYWwgZGF0YSBjb21lIGZyb20gW3RoaXMgcmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL2NpZW5jaWFkZWRhZG9zLXVmY2cvdmlzLWNhbmNvZXMpLiBUaGUgZXhwbGFuYXRpb24gYWJvdXQgaG93IHRoZSBkYXRhIHdlcmUgZ2VuZXJhdGVkaXMgYXZhaWxhYmxlIFthdCB0aGUgU3BvdGlmeSBBUEkgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9iZXRhLmRldmVsb3Blci5zcG90aWZ5LmNvbS9kb2N1bWVudGF0aW9uL3dlYi1hcGkvcmVmZXJlbmNlL29iamVjdC1tb2RlbC8jYXVkaW8tZmVhdHVyZXMtb2JqZWN0KS4KCiMjIyBDb25zaWRlcmF0aW9ucwoKSW4gdGhlIGFuYWx5c2lzIGJlbG93IHdlIGNvdWxkOgoKKiBTZWUgaG93IHNwZWVjaCB3YXMgbm90IHRoZSByZWFsIGNvcmUgb2YgZGFuY2FiaWxpdHkgb2YgSmFja3NvbidzIHNvbmdzLCB3aGljaCB3YXMgdG8gYmUgZXhwZWN0ZWQgZnJvbSB0aGUgKipLaW5nIG9mIHJpdGhtKiouCiogU2VlIGhvdyBvbiBTcG90aWZ5IG1vc3QgYWxidW1zIGFyZSByZW1hc3RlcmVkL3JlbGF1bmNoZWQgYW5kIHRob3NlIGFyZSB0aGUgbW9zdCBwb3B1bGFyLgoqIEdsaW1wc2UgdGhlIGluY3JlZGlibGUgZGl2ZXJzaXR5IG9mIHRoZSBzaW5nZXIgd2hpY2ggd2FzIHJlYWZmaXJtZWQgaW4gdGVybXMgb2YgbXVzaWNhbCBub3RlcyBhbmQgbGVuZ3RoLgoqIFJlYWxpemUgaG93IHRvbmUgYW5kIHRyYWNrIGR1cmF0aW9uIG9mIEphY2tzb24ncyBzb25ncyBkbyBub3Qgb25seSByZXByZXNlbnQgdGhlIGluY3JlZGlibGUgZGl2ZXJzaXR5IG9mIGhpcyBtdXNpYywgYnV0IGFsc28gcmVwcmVzZW50IGhpcyBwcml2YXRlIGxpZmUuIEFuIGV2ZW50IGluIGhpcyBwcml2YXRlIGxpZmUgaW1wYWN0cyBzZW5zaWJseSB0aGUgdG9uZSBvZiBoaXMgbXVzaWMuIAoKYGBge3Igc2V0dXAsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRwbHlyLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShoaWdoY2hhcnRlcikKbGlicmFyeShzdHJpbmdyKQp0aGVtZV9zZXQodGhlbWVfYncoKSkKYGBgCgojIyBEYXRhIE92ZXJ2aWV3CgpgYGB7cn0KZGF0YSA8LSByZWFkX2NzdihoZXJlOjpoZXJlKCJkYXRhL2phY2tzb24uY3N2IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IGNvbF9kb3VibGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV91cmkgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1fbmFtZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV9pbWcgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1fcmVsZWFzZV9kYXRlID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX3JlbGVhc2VfeWVhciA9IGNvbF9kYXRlKGZvcm1hdCA9ICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV9wb3B1bGFyaXR5ID0gY29sX2ludGVnZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19uYW1lID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX3VyaSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3NpZ25hdHVyZSA9IGNvbF9pbnRlZ2VyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X21vZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfcG9wdWxhcml0eSA9IGNvbF9pbnRlZ2VyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSAlPiUKICAgICAgICAgbXV0YXRlKGFsYnVtX25hbWUgPSBnc3ViKCIuKigxOTU0KS4qIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIE11c2ljIG9mIEJyYXppbC9KYWNrc29uIGRvIFBhbmRlaXJvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX25hbWUpKTsKZGF0YSAlPiUgCiAgICBnbGltcHNlKCkKYGBgCgojIyMgRGFuw6dhYmlsaWRhZGUgKGRhbmNlYWJpbGl0eSkKCmBgYHtyfQpkYXRhICU+JSAKICAgIGdncGxvdChhZXMoc2FtcGxlPWRhbmNlYWJpbGl0eSkpICsgCiAgICAgICAgc3RhdF9xcSgpCmBgYAoKYGBge3J9CmhjaGFydCAoZGF0YSRkYW5jZWFiaWxpdHksCiAgICAgICAgY29sb3IgPSAiI0I3MUMxQyIsCiAgICAgICAgbmFtZSA9ICJEYW7Dp2FiaWxpZGFkZSIpCmBgYAoKKiBOZW5odW0gdmFsb3IgZm9yYSBkbyBkb23DrW5pbyBkb3MgdmFsb3JlcywgYSBkYW7Dp2FiaWxpZGFkZSBwYXJlY2UgZ2lyYXIgZW0gdG9ybm8gZGUgMC42IGUgMC43LgoKIyMjIFZlcmJvc2lkYWRlIChzcGVlY2hpbmVzKQoKYGBge3J9CmRhdGEgJT4lIAogICAgZ2dwbG90KGFlcyhzYW1wbGU9c3BlZWNoaW5lc3MpKSArIAogICAgICAgIHN0YXRfcXEoKQpgYGAKCmBgYHtyfQpoY2hhcnQgKGRhdGEkc3BlZWNoaW5lc3MsCiAgICAgICAgY29sb3IgPSAiI0I3MUMxQyIsCiAgICAgICAgbmFtZSA9ICJWZXJib3NpZGFkZSIpCmBgYAoKKiBOZW5odW0gdmFsb3IgZm9yYSBkbyBkb23DrW5pbyBkb3MgdmFsb3Jlcy4gQSB2ZXJib3NpZGFkZSDDqSBlbSBnZXJhbCBiYWl4YSwgb2JzZXJ2YW5kbyBhIG3DunNpY2EgZGUgSmFja3NvbiBvIHJpdG1vIHBhcmVjZSBzZXIgYSBxdWVzdMOjbyBwcmluY2lwYWwsIGNvbSBsZXRyYXMgY3VydGFzIGUgcXVhc2UgcmVwZXRpdGl2YXMuCgojIyMgRHVyYcOnw6NvIChkdXJhdGlvbikKCmBgYHtyfQpkYXRhIDwtIGRhdGEgJT4lCiAgICBtdXRhdGUoZHVyYXRpb25fcyA9IGR1cmF0aW9uX21zLzEwMDApCgpkYXRhICU+JSAKICAgIHNlbGVjdChkdXJhdGlvbl9zKSAlPiUKICAgIGdsaW1wc2UoKQpgYGAKCgpgYGB7cn0KZGF0YSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHNhbXBsZT1kdXJhdGlvbl9zKSkgKyAKICAgICAgICBzdGF0X3FxKCkKYGBgCgpgYGB7cn0KaGNoYXJ0IChkYXRhJGR1cmF0aW9uX3MsCiAgICAgICAgY29sb3IgPSAiI0I3MUMxQyIsCiAgICAgICAgbmFtZSA9ICJEdXJhw6fDo28gKHMpIikKYGBgCgoqIE5lbmh1bSB2YWxvciBmb3JhIGRvIGRvbcOtbmlvIGRvcyB2YWxvcmVzLiBBcyBtw7pzaWNhcyBnaXJhbSBlbSB0b3JubyBkZSAxNjAgc2VndW5kb3MgKDIgbWludXRvcyBlIDQwIHNlZ3VuZG9zKSwgYXMgbcO6c2ljYXMgZGUgSmFja3NvbiBzw6NvIGVtIGdlcmFsIGN1cnRhcy4KCiMjIyBSZW1hc3Rlcml6YcOnw6NvIChyZW1hc3RlcikKCgpgYGB7cn0KZGF0YSA8LSBkYXRhICU+JQogICAgbXV0YXRlKHJlbWFzdGVyID0gYWxidW1fcmVsZWFzZV9kYXRlID4gIjE5ODEtMzAtMTIiKQoKZGF0YSAlPiUgCiAgICBzZWxlY3QoYWxidW1fbmFtZSwgYWxidW1fcmVsZWFzZV95ZWFyLCByZW1hc3RlcikgJT4lCiAgICBzYW1wbGVfbigxMCkKYGBgCgoKYGBge3J9CnRlbXAgPC0gZGF0YSAlPiUgCiAgICBkaXN0aW5jdChhbGJ1bV9uYW1lLAogICAgICAgICAgICAgLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgICBtdXRhdGUocmVtYXN0ZXIgPSBpZmVsc2UocmVtYXN0ZXIgPT0gVFJVRSwicmVtYXN0ZXJpemFkbyIsIm9yaWdpbmFsIikpCgpoY2hhcnQodGVtcCRyZW1hc3RlciwKICAgICAgIGNvbG9yQnlQb2ludCA9IFRSVUUsCiAgICAgICBuYW1lPSLDgWxidW0iKQpgYGAKCiogw4FsYnVucyByZW1hc3Rlcml6YWRvcy9yZWxhbsOnYWRvcyBzw6NvIG11aXRvIG1haXMgZnJlcXVlbnRlcy4KCmBgYHtyfQp0ZW1wIDwtCiAgICBkYXRhICU+JSAKICAgIGRpc3RpbmN0KGFsYnVtX25hbWUsIC5rZWVwX2FsbCA9IFRSVUUpICU+JQogICAgZ3JvdXBfYnkoYWxidW1fcmVsZWFzZV95ZWFyKSAlPiUKICAgIHN1bW1hcmlzZShvcmlnaW5hbF9uID0gc3VtKCFyZW1hc3RlciksCiAgICAgICAgICAgICAgcmVtYXN0ZXJfbiA9IHN1bShyZW1hc3RlcikpCgpoaWdoY2hhcnQoKSAlPiUKCiAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IHRlbXAkYWxidW1fcmVsZWFzZV95ZWFyKSAlPiUKICBoY19hZGRfc2VyaWVzKHRlbXAkb3JpZ2luYWxfbiwgCiAgICAgICAgICAgICAgICB0eXBlID0gImNvbHVtbiIsCiAgICAgICAgICAgICAgICBjb2xvciA9ICIjQjcxQzFDIiwKICAgICAgICAgICAgICAgIG5hbWUgPSAiTsOjbyByZW1hc3Rlcml6YWRvIikgJT4lCiAgaGNfYWRkX3Nlcmllcyh0ZW1wJHJlbWFzdGVyX24sIAogICAgICAgICAgICAgICAgdHlwZSA9ICJjb2x1bW4iLAogICAgICAgICAgICAgICAgbmFtZSA9ICJSZW1hc3Rlcml6YWRvIikgICU+JQogICAgICBoY190aXRsZSh0ZXh0ID0gIk7Dum1lcm8gZGUgw6FsYnVucyBwb3IgYW5vIikKCmBgYAoKKiBPIGFubyBkZSAyMDE2IHJlcHJlc2VudGEgdW0gYXVtZW50byBhbHTDrXNzaW1vIG5hIGRpc3BvbmliaWxpemHDp8OjbyBkZSDDoWxidW5zIGRlIEphY2tzb24gbm8gU3BvdGlmeS4gCgojIyBNYWlzIGRpc2N1cnNvL2Rpw6Fsb2dvIChzcGVlY2hpbmVzKSB0ZW0gZWZlaXRvIHNvYnJlIGEgZGFuw6dhYmlsaWRhZGUgZGEgbcO6c2ljYT8KCmBgYHtyfQpwIDwtIGRhdGEgJT4lIAogICAgICAgIGRpc3RpbmN0KHRyYWNrX25hbWUsIC5rZWVwX2FsbCA9IFRSVUUpICU+JQogICAgICAgIGdncGxvdChhZXMoeD1zcGVlY2hpbmVzcywKICAgICAgICAgICAgICAgICAgIHk9ZGFuY2VhYmlsaXR5KSkgKwogICAgICAgIGdlb21fcG9pbnQoYWxwaGE9MC40KSAKCmdncGxvdGx5KHApCmBgYAoKPGJyPjwvYnI+CgpOw6NvIHBhcmVjZSBoYXZlciB1bWEgcmVsYcOnw6NvIGNsYXJhIGVudHJlIGEgZGFuw6dhYmlsaWRhZGUgZGFzIG3DunNpY2FzIGRlIEphY2tzb24gZSBhIHZlcmJvc2lkYWRlIGRlIHN1YXMgbcO6c2ljYXMuIFRlbW9zIG11aXRhcyBmYWl4YXMgZGUgZGlmZXJlbnRlIGdyYXUgZGUgZGFuw6dhYmlsaWRhZGUgZGUgbWVzbW8gZ3JhdSBiYWl4byBkZSB2ZXJib3NpZGFkZS4gIApRdWFuZG8gYXVtZW50YW1vcyBhIHZlcmJvc2lkYWRlIGRhcyBtw7pzaWNhcyAobWFpcyDDoCBkaXJlaXRhIG5vIGVpeG8pIGEgZGFuw6dhYmlsaWRhZGUgc2UgbWFudMOpbSByZWxhdGl2YW1lbnRlIGVzdMOhdmVsIChPIGF1bWVudG8gbmEgZGFuw6dhYmlsaWRhZGUgw6kgbWFyZ2luYWwpLiAgCgoKYGBge3J9CmRhdGEgJT4lIAogICAgZGlzdGluY3QodHJhY2tfbmFtZSwgLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHNwZWVjaGluZXNzLGRhbmNlYWJpbGl0eSkpICsKICAgIHN0YXRfZGVuc2l0eTJkKGFlcyhmaWxsID0gLi5sZXZlbC4uKSwgZ2VvbSA9ICJwb2x5Z29uIikgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDEsMC4wMSkpCgpgYGAKCjxicj48L2JyPgoKw4kgcG9zc8OtdmVsIHZlciBtYWlzIGNsYXJhbWVudGUgcXVlIG8gcG9udG8gZGUgbWFpb3Igb2NvcnLDqm5jaWEgKGN1bWUgb3UgcG9udG8gZGUgbGV2ZWwgbWFpcyBhbHRvKSDDqSBlbSBlbSB0b3JubyBkZSAwLjcgZGUgZGFuw6dhYmlsaWRhZGUgZSBkZSBhcHJveGltYWRhbWVudGUgMC4wNCAodmFsb3JlcyBtdWl0byBiYWl4byBkZSB2ZXJib3NpZGFkZSkuICAgCklzc28gaW1wbGljYSBlbSBhbGdvIGrDoSBlc3BlcmFkbywgSmFja3NvbiBuw6NvIHByZWNpc2EgZmFsYXIgbXVpdG8gcHJhIHRvcm5hciBzdWFzIG3DunNpY2FzIGRhbsOnYW50ZXMsIG7Do28gw6kgYSB0b2EgcXVlIEphY2tzb24gZ2FuaG91IGEgYWxjdW5oYSBkZSBSZWkgZG8gUml0bW8uIAoKKiBPIGF1bWVudG8gZW0gdmVyYm9zaWRhZGUgbsOjbyBwYXJlY2UgYWZldGFyIHNpZ25pZmljYXRpdmFtZW50ZSBhIGRhbsOnYWJpbGlkYWRlLgoqIFZlcmJvc2lkYWRlIG7Do28gc2VyaWEgYSByZWFsIHJhesOjbyBkYSBzaWduaWZpY2F0aXZhIGRhbsOnYWJpbGlkYWRlIGRhcyBtw7pzaWNhcyBkZSBKYWNrc29uLCBvIHF1YWwgw6kgbm90w7NyaW8gcGVsYSBiYXRpZGEgZSByaXRtbyBkZSBzdWFzIG3DunNpY2FzICh0ZW5kbyBzaWRvIG5vbWVhZG8gYXTDqSBtYWlvciByaXRtaXN0YSBkYSBoaXN0w7NyaWEgZGEgbcO6c2ljYSBwb3B1bGFyIGJyYXNpbGVpcmEpLiAgICAgCgojIyBDb21vIG8gcGFzc2FyIGRvcyBhbm9zIGFmZXRhIG8gdGVtcG8gZGUgZHVyYcOnw6NvIGRhIG3DunNpY2E/CgpgYGB7cn0KbSA8LSBsaXN0KAogIGwgPTcwLAogIGIgPSAxNTApCgpwIDwtIGRhdGEgJT4lIAogICAgZ2dwbG90KGFlcyh4PWFzLmZhY3RvcihhbGJ1bV9yZWxlYXNlX3llYXIpLAogICAgICAgICAgICAgICBkdXJhdGlvbl9zLAogICAgICAgICAgICAgICBncm91cD1hbGJ1bV9yZWxlYXNlX3llYXIsCiAgICAgICAgICAgICAgIGNvbG9yPXJlbWFzdGVyKSkgKwogICAgZ2VvbV9ib3hwbG90KHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGE9MC42KSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9IDEpKQoKZ2dwbG90bHkocCkgJT4lCiAgICAgbGF5b3V0KGF1dG9zaXplID0gRiwgbWFyZ2luPW0pCmBgYAoKT2xoYW5kbyBwYXJhIG9zIMOhbGJ1bnMgb3JpZ2luYWlzIChyZW1hc3RlciA9IEZBTFNFKSDDqSBwb3Nzw612ZWwgcGVyY2ViZXIgdW0gZ3JhbmRlIGF1bWVudG8gbm8gdGVtcG8gZGUgZHVyYcOnw6NvIGRhcyBtw7pzaWNhcyBubyDDoWxidW0gZW0gMTk2NyBzZWd1aWRvIGRlIHVtYSBkaW1pbnVpw6fDo28gbm8gw6FsYnVtIHNlZ3VpbnRlIDE5NjguIEVzc2UgY2hvcXVlIG5vIHBlcmZpbCBkb3MgZG9pcyDDoWxidW5zIHJlcXVlciB1bWEgZXhwbGljYcOnw6NvIHF1ZSBuw6NvIGVzdMOhIG5vcyBkYWRvcy4KCk8gw6FsYnVtIGRlIDE5NjcgKipBIEJyYXphIGRvIE5vcnRlKiosIHByaW1laXJvIGdyYXZhZG8gbmEgZ3JhdmFkb3JhIENhbnRhZ2FsbyBtYXJjYSB0YW1iw6ltIHVtIG1vbWVudG8gZXNwZWNpYWwgbmEgdmlkYSBkbyBjYW50b3IsIHBvaXMgZXNzZSDDqSBvIGFubyBkZSBzZXUgZGl2w7NyY2lvIGRlIEFsbWlyYSwgcGFyY2VpcmEgbmEgbcO6c2ljYSBlIGVzcG9zYS4gRGUgbcO6c2ljYXMgbWFpcyBsb25nYXMgZSBkZSBmYWl4YXMgZGUgbGV0cmEgbWFpcyB0cmlzdGUgY29tbyAqKiJQYXNzYXJpbmhvIGFiYW5kb25hZG8iKiogY29tcG9zdGEgcGVsbyBwcsOzcHJpbyBKYWNrc29uLCBlc3NlIHBlcmZpbCBpbmNvbXVtIGRvIMOhbGJ1bSBhY2FiYSBwb3IgcmVmbGV0aXIgZXNzZSBtb21lbnRvIGRhIHZpZGEgZG8gY2FudG9yLgoKTyDDoWxidW0gZGUgMTk2OCBwb3Igb3V0cm8gbGFkbyDDqSB1bWEgY29sZXTDom5lYSBlIHJlw7puZSBhbGd1bWFzIGRhcyBtw7pzaWNhcyBhdMOpIGVudMOjbyBtYWlzIHBvcHVsYXJlcyAoZSB0YW1icGVtIGN1cnRhcyBkbyBjYW50b3IpLiBFc3NhIGNvbGV0w6JuZWEgY2FzYSBjb20gdW0gaW5hdWRpdG8gcG9yw6ltIGN1cnRvIGhpYXRvIGRvIGNhbnRvciBxdWUgcGVsYSBwcmltZWlyYSB2ZXogcGFzc2EgdW0gYW5vIHNlbSBwdWJsaWNhciB1bSDDoWxidW0sIG8gcXVhbCBwb2RlIHNlciBhdHJpYnXDrWRvIGFvIHNldSBkaXbDs3JjaW8uCgoqIE9zIMOhbGJ1bnMgcmVtYXN0ZXJpemFkb3MvcmVsYW7Dp2Fkb3MgcmXDum5lbSBmYWl4YXMgYWxndW1hcyB2ZXplcyBkZSBkaWZlcmVudGVzIG1vbWVudG9zIGRhIGNhcnJlaXJhIGRvIGNhbnRvciwgZSBwb3IgaXNzbyBmaWNhIGRpZsOtY2lsIGF0cmlidWlyIHVtIHNpZ25pZmljYWRvIHBlcnRpbmVudGUgw6AgZHVyYcOnw6NvIGRlIHN1YXMgZmFpeGFzLiAKCgojIyBPcyBhbGJ1bnMgcmVsYW7Dp2Fkb3MvcmVtYXN0ZXJpemFkb3Mgc8OjbyBtYWlzIHBvcHVsYXJlcz8gCgpgYGB7cn0KIyBsb2xsaXBvcCBjaGFydAptIDwtIGxpc3QoCiAgbCA9IDM3MCkKCnAgPC0gZGF0YSAlPiUKICAgICAgICBnZ3Bsb3QoYWVzKGFsYnVtX3BvcHVsYXJpdHkseT1yZW9yZGVyKGFsYnVtX25hbWUsYWxidW1fcG9wdWxhcml0eSksCiAgICAgICAgICAgICAgICAgICBjb2xvcj1yZW1hc3RlciwKICAgICAgICAgICAgICAgICAgIGdyb3VwPXJlbWFzdGVyKSkgKwogICAgICAgICAgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAwLCB5ID0gcmVvcmRlcihhbGJ1bV9uYW1lLGFsYnVtX3BvcHVsYXJpdHkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZW5kID0gYWxidW1fcG9wdWxhcml0eSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVuZCA9IGFsYnVtX25hbWUpKSArIAogICAgICAgIGdlb21fcG9pbnQoKSArCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSkKCmdncGxvdGx5KHAsdG9vbHRpcD1OQSkgJT4lCiAgbGF5b3V0KGF1dG9zaXplID0gRiwKICAgICAgICAgbWFyZ2luID0gbSkKYGBgCgpGaWNhIGV2aWRlbnRlIHF1ZSBwYXJhIEphY2tzb24gZG8gUGFuZGVpcm8gKipvcyDDoWxidW5zIHJlbWFzdGVyaXphZG9zL3JlbGFuw6dhZG9zIGRvbWluYW0gbyBjZW7DoXJpbyBkbyBTcG90aWZ5IGVtIHRlcm1vcyBkZSBwb3B1bGFyaWRhZGUqKi4gClByaW1laXJhbWVudGUsIHNpbXBsZXNtZW50ZSBvYnNlcnZhbmRvIGEgcHJvcG9yw6fDo28gZW50cmUgcmVtYXN0ZXJpemFkb3MgZSBuw6NvIHJlbWFzdGVyaXphZG9zIGZpY2EgZXZpZGVudGUgcXVlIG9zIHByaW1laXJvcyBzw6NvIG9zIHF1ZSBvIFNwb3RpZnkgbWFpcyBkaXNwb25pYmlsaXphLiBTZWd1bmRvLCBsZXZhbmRvIGVtIGNvbnNpZGVyYcOnw6NvIGEgcXVlc3TDo28gZGUgcXVhbGlkYWRlIGRlIMOhdWRpbyBlcmEgZGUgc2UgZXNwZXJhciBxdWUgb3MgcmVtYXN0ZXJpemFkb3MgdG9tYXNzZW0gYSBkaWFudGVpcmEuCgojIyBDb21vIG8gdGVtcG8gYWZldGEgYSBkaXN0cmlidWnDp8OjbyBkYXMgbm90YXMgbXVzaWNhaXMgPwoKYGBge3J9CnRpbTEyZXF1YWwgPSBjKCIjMDAwMDhGIiwgIiMwMDAwRUEiLCAiIzAwNDdGRiIsICIjMDBBMkZGIiwgIiMwMEZFRkYiLCAiIzVBRkZBNSIsICIjQjVGRjRBIiwgIiNGRkVEMDAiLCAiI0ZGOTIwMCIsICIjRkYzNzAwIiwgIiNEQjAwMDAiLCAiIzgwMDAwMCIpCgoKbSA8LSBsaXN0KAogICAgbD04MCwKICAgIHI9MzApOwoKcCA8LSAgZGF0YSAlPiUKICAgIHNlbGVjdChrZXksYWxidW1fcmVsZWFzZV9kYXRlLCByZW1hc3RlcikgJT4lCiAgICBncm91cF9ieShhbGJ1bV9yZWxlYXNlX2RhdGUsa2V5LHJlbWFzdGVyKSAlPiUKICAgIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lCiAgICBtdXRhdGUocHJvcCA9IGNvdW50L3N1bShjb3VudCkpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKGFsYnVtX3JlbGVhc2VfZGF0ZSksIAogICAgICAgICAgICAgICB5ID0gY291bnQsIGZpbGwgPSBrZXksCiAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZSgKICAgICAgICAgICAgICAgICAgICAiUHJvcG9yw6fDo286IiwgY291bnQgKiAxMCwiJSIKICAgICAgICAgICAgICAgICAgICAgKSkpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIiwgd2lkdGggPSAuNykgICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHRpbTEyZXF1YWwpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpICArCiAgICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSkgKwogICAgZmFjZXRfZ3JpZChyZW1hc3RlciB+IC4pICsKICAgIGdndGl0bGUoIk5vdGFzIG11c2ljYWlzIChkaXN0aW7Dp8OjbyBwb3IgcmVtYXN0ZXJpemHDp8OjbykiKSArCiAgICBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQodGl0bGU9IiIpKQoKZ2dwbG90bHkocCwgdG9vbHRpcD0idGV4dCIpICU+JQogICAgICBsYXlvdXQoYXV0b3NpemUgPSBGLAogICAgICAgICAgICAgbWFyZ2luID0gbSwKICAgICAgICAgICAgIGxlZ2VuZCA9IGxpc3QoCiAgICAgIG9yaWVudGF0aW9uID0gImgiLCB5ID0tMC4yCiAgICApKQoKYGBgCgoqIMOJIHBvc3PDrXZlbCB2ZXIgcXVlIG5vIGNvbWXDp28gZG9zIGFub3MgMTk2MCDDrW5pY2lvIGFzIG3DunNpY2FzIG5hIGVzY2FsYSBlbnRyZSBFIGUgRyBkb21pbmFtIGZvcnRlbWVudGUgbyByZXBlcnTDs3JpbyBkZSBKYWNrc29uLCBjdXJpb3NhbWVudGUgcXVhbmRvIGFzIG3DunNpY2FzIGRlIG5vdGFzIGVudHJlIEEgZSBDIGNoZWdhbSBhIG9jdXBhciBtZXRhZGUgZGFzIG9jb3Jyw6puY2lhcy4gICAKICAgICsgSXNzbyBlc3TDoSBkZSBhY29yZG8gY29tIG8gcGVyZmlsIGRlIEphY2tzb24sIG5vdMOzcmlvIHBvciBzdWEgaGV0ZXJvZ2VuZWlkYWRlLCBhbMOpbSBkaXNzbyBvIMOhbGJ1bSBkZSAxOTY3IGNvbW8gZm9pIGRpdG8gYW50ZXJpb3JtZW50ZSByZXByZXNlbnRhIHVtYSBtdWRhbsOnYSBubyB0b20gZG8gY2FudG9yIHRhbWLDqW0gcG9yIG1vdGl2b3MgcGVzc29haXMgKHNldSBkaXbDs3JjaW8pLiAgCiAqIE9zIMOhbGJ1bnMgcmVtYXN0ZXJpemFkb3MgcmVmbGV0ZW0gdW1hIGdyYW5kZSB2YXJpYcOnw6NvIGVtIHRlcm1vcyBkZSBub3RhcyBtdXNpY2FpcyBqw6EgZXNwZXJhZGEgZGFkbyBxdWUgZXNzZSBjb25qdXRvIHJlw7puZSB1bWEgcXVhc2UgY2HDs3RpY2Egc8OpcmllIGRlIGNvbGV0w6JuZWFzLCBzZWxlw6fDtWVzIGRpdmVyc2FzIGUgcmVsYW7Dp2FtZW50b3MgcXVlIGFjYWJhbSBtaXN0dXJhbmRvIG1vbWVudG9zIGRpZmVyZW50ZXMgZGEgY2FycmVpcmEgZG8gY2FudG9yLiAgCiAgICArIE8gZmF0byBkZSBKYWNrc29uIHNlIGVudHJlZ2FyIGEgZGl2ZXJzb3MgZXN0aWxvcyBtdXNpY2FpcyDFm28gbXVsdGlwbGljYSBlc3NhIHZhcmlhw6fDo28gZW0gdGVybW9zIGRlIG5vdGFzIG11c2ljYWlzIChKYWNrc29uIHNlIGVudm9sdmV1IGNvbSBiYWnDo28sIHhvdGUsIHhheGFkbywgY29jbywgYXJyYXN0YXDDqSwgcXVhZHJpbGhhLCBtYXJjaGEsIGZyZXZvLCAqKmUgb3V0cm9zKiopLCBpc3NvIGZpY2EgZXZpZGVudGUgbmEgdmFyaWHDp8OjbyBqw6Egbm9zIMOhbGJ1bnMgbsOjbyByZW1hc3Rlcml6YWRvcy4K